- DispatcherServlet UML类图
- DispatcherServlet初始化序列图
- DispatcherServlet初始化分析
- ContextLoaderListener初始化的前后文和DispatcherServlet初始化的上下文关系
DispatcherServlet UML类图
"DispatcherServlet初始化序列图
"DispatcherServlet初始化分析
HttpServletBean init方法
在servlet初始化阶段会调用其init方法,所以首先看DispatcherServlet中是否重写了init方法,在其父类HttpServletBean中找到了该方法。
1 | public final void init() throws ServletException { |
将当前的servlet类型转化为BeanWrapper类型实例,以便使用Spring中提供的注入功能进行对应属性的注入。
WebApplicationContext的初始化
initWebApplicationContext函数的功能就是创建或者刷新WebApplicationContext实例并对servlet功能所使用的变量进行初始化
1 | protected WebApplicationContext initWebApplicationContext() { |
其中代码“WebApplicationContext rootContext =WebApplicationContextUtils.getWebApplicationContext(getServletContext());“就是为了获取ContextLoaderListener初始化的webApplicationContext,”wac = createWebApplicationContext(rootContext);”创建了并刷新了WebApplicationContext。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24protected WebApplicationContext createWebApplicationContext(ApplicationContext parent) {
Class<?> contextClass = getContextClass();
if (this.logger.isDebugEnabled()) {
this.logger.debug("Servlet with name '" + getServletName() +
"' will try to create custom WebApplicationContext context of class '" +
contextClass.getName() + "'" + ", using parent context [" + parent + "]");
}
if (!ConfigurableWebApplicationContext.class.isAssignableFrom(contextClass)) {
throw new ApplicationContextException(
"Fatal initialization error in servlet with name '" + getServletName() +
"': custom WebApplicationContext class [" + contextClass.getName() +
"] is not of type ConfigurableWebApplicationContext");
}
ConfigurableWebApplicationContext wac =
(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
wac.setEnvironment(getEnvironment());
wac.setParent(parent);
wac.setConfigLocation(getContextConfigLocation());
configureAndRefreshWebApplicationContext(wac);
return wac;
}
”wac.setParent(parent);“servlet中的webapplicationContext复用/共享contextLoaderListener中的webapplicationContext.
onRefresh
onRefresh是FrameworkServlet类中提供的模板方法,在其子类DispatcherServlet中进行了重写,主要用于刷新Spring在web功能实现所必须使用的全局变量。
1 | protected void onRefresh(ApplicationContext context) { |
1 | /** |
初始化HandlerAdapters
1 | /** |
加载默认的适配器
1 | /** |
在getDefaultStrategies函数中,spring会尝试从defaultStrategies中加载对应的HandlerAdapter的属性。defaultStrategies在DispatcherServlet静态代码块中被初始化
1 | static { |
DispatcherServlet.properties文件:
1 | org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\ |
ContextLoaderListener初始化的前后文和DispatcherServlet初始化的上下文关系
"从图中可以看出:
ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;
DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。